var nodemailer = require("nodemailer");
var userModel = require("../models/user.model");
var tUserModel = require("../models/tUser.model");
var nodeRSA = require("node-rsa");
var config = require("../config.lib");
var time = 5;//分钟

function clearTUser(){//清理数据库
    let date = new Date().getTime() - time * 60000;//删除时间小于time分钟的临时用户。

    tUserModel.deleteMany({date: {$lt: date}}, (err, res)=>{
        if(err){
            console.error(err);
        }else{
            console.log("res-->", res);
        }
    });
}
async function sendMail(req, res, next){
    let testAccount = await nodemailer.createTestAccount(),
        body = JSON.parse(req.body.data),
        url = "http://localhost:3000/registerThird?username=",
        jsenc = new nodeRSA(config.publicKey),//可以用来加密的对象
        rsa = new nodeRSA(config.privateKey);
        
    body.password = rsa.decrypt(body.password, "utf8");//解密
    url += jsenc.encrypt(body.username, 'base64');
    // create reusable transporter object using the default SMTP transport
    let transporter = nodemailer.createTransport({
        host: "smtp.qq.com",
        port: 587,//smtp端口
        secure: false, // true for 465, false for other ports，使用ssl
        auth: {
            user: "2050986448@qq.com", // generated ethereal user
            pass: "sfzrwpsrscoefcfj" // generated ethereal password，qq邮箱的授权码
        }
    });
    
    // console.log("testAccount.user", testAccount.user, testAccount.pass );//这个是内置的用户和授权码
    let info = await transporter.sendMail({//发送邮件
        from: "2050986448@qq.com", // sender address
        to: body.account, // 接收邮件的人，可以是列表，用逗号分开？
        subject: "航程注册", // Subject line标题
        text: "航程注册链接", // plain text body
        html: "<b>请点击以下链接完成注册</b><p>链接有效时间为" + time + "分钟:" + url + "</p><p>若以上链接不能正常点击请复制该链接到浏览器直接访问</p>" // html body
    }, function(error, response){
        if(error){//发送邮件出错
            console.log(error);
            res.json({
                success: false,
                description: "发送邮件出错"
            })
        }else{//发送邮件成功
            let obj = {...body, date: new Date().getTime()};
            //将用户信息存到临时数据库temporaryUser。在每个请求发起的时候清理一次临时数据库超过5分钟的数据。
            let newuser = new tUserModel(obj);
            newuser.save((err, data)=>{
                if(err){
                    console.error(err);
                    res.json({
                        success: false,
                        description: "保存到临时用户表里出错"
                    })
                }else{
                    res.json({
                        success: true,
                        description: "发送了邮件",
                        data:{
                            state: 0,
                            data: data
                        }
                    })
                    clearTUser();
                }
            })
        }
        smtpTransport.close(); // 如果没用，关闭连接池,不知道要不要关，暂时好像不用关
    });
    //下面的好像没什么用
    // console.log("Message sent: %s", info.messageId, info);
    // // Message sent: <b658f8ca-6296-ccf4-8306-87d57a0b4321@example.com>
    // // Preview only available when sending through an Ethereal account
    // console.log("Preview URL: %s", nodemailer.getTestMessageUrl(info));
    // // Preview URL: https://ethereal.email/message/WaQKMgKddxQDoou...
}

module.exports={
    registerFirst:function(req, res, next){
        //先检测邮箱是否重复，重复就不能注册了
        let body = JSON.parse(req.body.data);
        userModel.find({account: body.account}, (err, data)=>{
            if(err){
                res.json({
                    success: false,
                    description:"注册查询用户信息出错"
                })
            }else{
                if(data.length){//邮箱重复
                    res.json({
                        success: true,
                        data:{
                            state: 1
                        }
                    })
                }else{
                    sendMail(req, res, next).catch(console.error);
                }
            }
        })
    },
    rigisterSecond: function(req, res, next){
        let body = JSON.parse(req.body.data),
            rsa = new nodeRSA(config.privateKey);

        //将这个用户名的用户从临时表里面移动到正式的表里面。
        tUserModel.findOne({username: rsa.decrypt(body.username, "utf8")}, (err, doc)=>{
            if(err){
                console.error(err);
                res.json({
                    success: false,
                    description: "查询临时表里用户出错"
                })
            }else{
                //移动到正式表里
                if(doc){//链接还没失效，就是还没到5分钟。
                    delete doc._id;
                    let obj = {
                            account: doc.account,
                            username: doc.username,
                            password: doc.password,
                            birthday: doc.birthday,
                            gender: doc.gender,
                        },
                        newuser = new userModel(obj);

                    console.log("保存新的用户", obj);
                    newuser.save((err, data)=>{
                        if(err){
                            console.error(err);
                            res.json({
                                success: false,
                                description: "保存信息到正式表里出错"
                            })
                        }else{
                            //将这个信息从临时表里删除。
                            tUserModel.deleteOne({}, (err, doc)=>{
                                if(err){
                                    console.error(err);
                                    res.json({
                                        success: false,
                                        description:"删除临时表的当前信息出错"
                                    })
                                }else{
                                    res.json({
                                        success: true,
                                        description: "用户注册完成",
                                        data:{
                                            state: 0,
                                            data: doc
                                        }
                                    })
                                }
                            })
                        }
                    })
                }else{
                    res.json({
                        success: true,
                        description: "连接已经失效",
                        data:{
                            state: 1
                        }
                    })
                }
            }
        })
        
    },
    repeatTest:function(req, res, next){
        //检测用户名是否重复
        userModel.find({username: req.query.username},(err, data)=>{
            if(err){ 
                console.error(err);
            }else{
                if(data.length){
                    res.json({
                        success: true,
                        description:"用户已经存在",
                        data:{
                            state:1
                        }
                    })
                }else{
                    //临时表里锁定的用户名也要检测
                    tUserModel.find({username: req.query.username}, (err, data)=>{
                        if(err){
                            console.error(err);
                            res.json({
                                success: false,
                                description: "查询临时用户表出错"
                            })
                        }else{
                            if(data.length){//用户名存在于临时表里面
                                res.json({
                                    success: true,
                                    description:"用户已经存在",
                                    data:{
                                        state:1
                                    }
                                })
                            }else{
                                res.json({
                                    success: true,
                                    data:{
                                        state:0
                                    }
                                })
                            }
                        }
                    })
                }
            }
        });
    }
}